/**
 * *******************************************
 * user: zmq
 * describe:    gate服的逻辑处理
 * created:
 * date: 2021/8/19
 * *******************************************
 */

import AccountDao from "../dao/mysqlDao/accountDao";
import {FrontendSession, pinus} from "pinus";
import {ILoginAccount, IRegisterAccount} from "../consts/interface";
import {logger} from "../util/logger";
import Dispatcher from "../util/dispatcher";
import {ENV} from "../consts/consts";
import {MessagePack} from "../util/messagePack";
import {ERRORCODE} from "../util/errorCode";


/**
 * 单例模式，内存唯一指向
 */
class GateService {

    private static _instance: GateService = undefined;      // 声明一个 GateService 对象
    // private serverId: string;                            // 服务器id

    /**
     * 构造函数
     */
    private constructor() {

    };

    /**
     * 返回一个唯一实例
     * @returns {ConnectorService}
     */
    public static getInstance(): GateService {               // 返回一个唯一实例
        if (this._instance === undefined) {
            this._instance = new GateService();
        }
        return this._instance;
    };


    /**
     * 初始化gate逻辑实例
     */
    public init() {
        // this.serverId = serverId;
    }

    /**
     * 注册账号
     * @param {IRegisterAccount} msg
     * @returns {Promise<any>}
     */
    public async accountRegister(msg: IRegisterAccount) {

        let account: string = msg.account,                  // 账号
            pwd: string = msg.pwd;                          // 密码

        // 只允许生产环境才可以注册账号
        let env = pinus.app.get('env');
        if (env !== ENV.dev) {
            return MessagePack.failResult(ERRORCODE.GATE_NOT_ALLOW_GM_COMMAND);
        }

        let accountData = await AccountDao.getAccount(account);
        if (!accountData) {  // 查询账号信息错误抛出
            return MessagePack.failResult(ERRORCODE.MYSQL_GET_ERROR);
        }

        if (accountData.length > 0) { // 不允许重复注册账号
            return MessagePack.failResult(ERRORCODE.GATE_ACCOUNT_IS_EXIST);
        }

        // 数据库插入账号信息
        let addAccountData = await AccountDao.addAccount(account, pwd);
        if (addAccountData) {  // 查询账号信息错误抛出
            logger.info("addAccountErr --> ", addAccountData);
            return MessagePack.failResult(ERRORCODE.MYSQL_ADD_ERROR);
        }

        return MessagePack.successResult("register account success!");
    }


    /**
     * 账号登录
     * @param {FrontendSession} session
     * @param {ILoginAccount} msg
     * @returns {Promise<any>}
     */
    public async accountLogin(session: FrontendSession, msg: ILoginAccount) {

        let account: string = msg.account,                  // 账号密码
            pwd: string = msg.pwd;                          // 密码前端要自己MD5加密

        // let env = pinus.app.get('env');                      // 获取开发环境
        // let curTime = Utils.getCurTime();                    // 获取当前时间

        let accountData = await AccountDao.getAccount(account);
        if (!accountData) {  // 查询账号信息错误抛出
            return MessagePack.failResult(ERRORCODE.MYSQL_GET_ERROR);
        }

        if (accountData.length === 0) { // 账号数据不存在
            return MessagePack.failResult(ERRORCODE.GATE_ACCOUNT_NOT_EXIST);
        }

        let accountInfo = accountData[0];                                // 获取索引下来的账号信息
        if (accountInfo["pwd"] && accountInfo["pwd"] !== pwd) {          // 密码错误
            return MessagePack.failResult(ERRORCODE.GATE_PWD_IS_WRONG);
        }

        // -------- 密码校验成功后，需要返回什么，在这里操作
        let res = Dispatcher.apportionConnector(account);               // 分配Connector服
        if (!res || !res.clientHost || !res.clientPort) {               // 不可用
            return MessagePack.failResult(ERRORCODE.CONNECTOR_ERROR);
        }

        // 获取已创建角色的服务器列表
        let roleList = {};
        return MessagePack.successResult({
            host: res.clientHost,
            port: res.clientPort,
            roleList: roleList
        })
    }
}

// 抛出接口
export default GateService.getInstance();
